﻿/*
 * redmicro all Copyright (c)
 *
 * 主键通过隐藏控件传递。
 * */
Rsd.define('Rsd.zen.dialog.FormDialog', {
    extend: 'Rsd.container.Dialog',
    requires: ['Rsd.widget.ModelForm'],
    xtype: 'form-dialog',
    width: 800,
    height: 600,   
    //
    style: { maxHeight: '95%' },
    /**
     * 【属性】，表示是否是只读
     */
    //readonly:true,
    layout: 'vbox',
    /**
     * 
     */
    items: [
        { 
            name:'fields-form',
            xtype: 'model-form',
            header: null,
            "style": { "overflow": 'visible' },
            height: 'auto',
            width: '100%',
            flex: 1, 
        },
        //buttons
        { 
            id:'buttons',
            xtype: 'container',
            height: 55,
            header: null, 
            layout: 'hbox',
            margin: '2 0 2 0',
            width: '100%',
            hidden: true,
            "style":{"minHeight": '55px'},
            items: []
        },
        //right 右侧空白区
        { 
            id:'right',
            xtype: 'container',
            header: null,  
            height: 55,
            width: '30%',
            margin: '2 0 2 0',
            float:true,
            hidden: true, 
            items: []
        }
    ],
    /**
     * { 
        width: null,//form表单宽度 
        height: null,//form表单高度
        method:null,//表单提交方式:POST or PUT
        action:null,//优先级排第一,指定form表单action 属性,以submit的方式提交整个表单数据
     * }
     */
    //form:{},
    //right:null,  
    /**
    * @description 表单字段
    */
    formFields: [], 
    /**
     * @description 字段 默认宽度
     */
    fieldWidth: '45%',
    /**
     * @description 字段 标签宽度,默认90
     */
    labelWidth: 90,  
    /**
     * function(record){}
     * @description 优先级排第二
     * @description 过设置saveHandler属性，将整个form数据作为参数传递给指定本地js方法,在本地处理
     */
    saveHandler: null,
    /**
     * @description 优先级排第三
     * @description 通过设置serviceName属性，将整个form数据作为参数提交给指定服务端API
     */
     saveServiceName: null, 
    /**
     * 方法删除
     */
    deleteHandler: null,
    /**
     * 接口服务删除
     */
    deleteServiceName: null,
    /**
     * 
     */
    onBeforeSave:null,
    /**
     * 按钮数组
     */
    buttons: ['save', 'delete', 'cancel'],
    /*
    * */
    constructor: function FormDialog(config) {
        config = config || {}; 
        this.apply(config);
    },

     /**
     * @description 加载数据
     *  */
     load: function load(record) {
        //console.error('form dialog load ',record,this.data);
        this.data = record || this.data||this.record;
        //console.log(this.data);
        this.items[0].loadData(this.data);
        return this;
    },
    /**
     * 
     */
    onBeforeInit:function onBeforeInit()
    { 
        //this.items[0].fields = this.formFields;    
        this.callParent();
    },
    /**
     * 
     */
    onAfterInit: function onAfterInit() {
        var me = this;
        
        var _fields = (this.formFields && this.formFields.length > 0) ? this.formFields :[];
        
        if(_fields && _fields.length > 0)
        {
            me.loadFormFields();
        }
        this.callParent();
        
        var btns = this.buttons || [];//console.log(btns);
        if(btns.length>0)
        {
            //添加一个占位块
            this.items[1].add({xtype:'component-x',width:100});
        }
        for (var i in btns) {

            if (Rsd.isString(btns[i])) {
                switch (btns[i]) {
                    case 'save':
                        if (this.readonly !== true) {
                            this.items[1].add({
                                xtype: 'button',
                                text: '保 存',
                                delayMS: 2000,
                                width: 100,
                                minWidth: 80,
                                height: 40,
                                minHeight: 40,
                                margin: '2 10 2 5',
                                handler: '_btn_save'
                            });
                        }

                        break;
                    case 'delete':
                        if (this.readonly !== true) {
                            this.items[1].add({
                                xtype: 'button',
                                text: '删 除',
                                delayMS: 2000,
                                width: 100,
                                minWidth: 80,
                                height: 40,
                                minHeight: 40,
                                margin: '2 10 2 5',
                                handler: '_btn_delete'
                            });
                        }
                        break;
                    case 'cancel':
                        this.items[1].add({
                            xtype: 'button',
                            text: '取 消',
                            width: 100,
                            minWidth: 80,
                            height: 40,
                            minHeight: 40,
                            margin: '2 10 2 5',
                            handler: '_btn_cancel'
                        });
                        break;
                }

            }

            if (Rsd.isObject(btns[i])) {
                var _btn = Rsd.apply(
                    {
                        xtype: 'button',
                        width: 100,
                        minWidth: 80,
                        height: 40,
                        minHeight: 40,
                        margin: '2 10 2 5'
                    }, btns[i]);

                _btn.__fn = _btn.handler || _btn.onclick || _btn.fn;
                var me = this;
                _btn.handler = function () {

                    if(!this.__fn)
                    {
                        alert('buttton对象为设置handler');
                        return ;
                    }

                    if (me.items[0].checkRecord() == false) {
                        me.items[0].showError();
                        return;
                    }

                    var _rs = me.funApplyByIOC(this.__fn, [me.items[0].getRecord(), me]);
                    if (_rs === true) {
                        me.close();
                    }
                }

                this.items[1].add(_btn);
            }
        }

        //显示按钮条
        var me = this;
        setTimeout(function () {
            me.items[1].show();
        }, 500);
    },
    /*
    *
    * */
    onAfterRender: function onAfterRender() {

        this.callParent();

        if (this.height == 'auto') {
            // 
        }
        else {
            this.dom.style.overflowY = 'auto';
        }
    },
    /**
     * 
     */
    onBeforeSaveHandler:function onBeforeSaveHandler(record)
    {
        if(this.onBeforeSave)
        {
            this.funApplyByIOC(this.onBeforeSave, [record,this]);
        }
    },
    /**
     * @description 加载字段,加载完字段，后会自动加载数据
     */
    loadFormFields:function loadFormFields()
    { 
        var _fields = (this.formFields && this.formFields.length > 0) ? this.formFields : [];
        _fields = _fields || []; 
        if(_fields.length == 0 )
        {
            console.error('没有编辑字段，formFields 和 schema都为空');
            return;
        }

        try {
 
            for (var i in _fields) {
                //_fields[i].required = true;
                if (Rsd.isString(_fields[i].label)) {
                    _fields[i].label = {content: _fields[i].label };
                }
                //统一设置 label 宽度
                if (this.labelWidth && _fields[i].label) {
                    _fields[i].label.width = _fields[i].label.width || this.labelWidth;
                }
                //统一设置 字段宽度
                if (this.fieldWidth) {
                    _fields[i].width = _fields[i].width||this.fieldWidth;
                }
            }
            var mv = this.items[0];
             
            if(_fields.length > 0)
            {
                mv.fields = _fields;
                
                if(mv.loadFields)
                {
                    //加载字段,加载完字段，后会自动加载数据
                    mv.loadFields(); 
                }
               
            } 
            
        } catch (ex) {
            Rsd.error('FormDialog加载模型结构失败', 'Rsd.zen.dialog.FormDialog', ex);
        }
    },
    /**
     * 
     */
    save:function save()
    {
        var me = this;

        if (me.readonly) {
            Rsd.alert('当前页面仅有只读权限。');
            return false;//flase 表示拒绝后续方法的处理
        }

        var _form = me.items[0];

        if (_form.checkRecord() == false) {
            _form.showError();
            return false;//flase 表示拒绝后续方法的处理
        }
 
        var _record = _form.getRecord();

        if (_record == null) {
            Rsd.msg("数据对象为空，无法保存。");
            return false;//flase 表示拒绝后续方法的处理
        }
        //console.log('form dialog',_record);
        //
        me.onBeforeSaveHandler(_record);
       
        //使用 formAction 提交
        if (_form.action) {  
            _form.submit();
            return false;//flase 表示拒绝后续方法的处理
        }

        //使用 saveHandler 方法
        if (me.saveHandler) { 
            me.funApplyByIOC(me.saveHandler,[_record]); 
            return false;
        }

        //使用 接口服务
        if (me.saveServiceName) { 

            Rsd.app.getService(me.saveServiceName).request(_record, function (resp) { 
                if (resp.success) {
                    me.close();
                    Rsd.showPopup("保存成功。");
                    return false;//flase 表示拒绝后续拦截方法的处理
                } 
                else 
                {
                    Rsd.alert('数据保存失败', resp.msg);
                    return false;//flase 表示拒绝后续拦截方法的处理
                }
            });

            return false;//flase 表示拒绝后续方法的处理
        } 
        //console.log('no action to do in formDialog');
        return true;//flase 表示后续方法的处理
       
    },
    /** 
    * @private button 事件绑定
    * */
    _btn_save: function _btn_save() {
        
        this.save(); 
    },
    /**
     * 
     */
    "delete":function _delete()
    {
        var me = this;
        if (me.readonly) {
            Rsd.alert('当前页面仅有只读权限。');
            return;
        }
        var _form = me.items[0];
         
        //指定方法
        if (me.deleteHandler) {
            var _record = _form.getRecord();
            me.deleteHandler(_record);
            return;
        }

         //指定接口服务
        if (me.deleteServiceName) {

            var _record = _form.getRecord();
            Rsd.app.getService(me.deleteServiceName).request(_record, function (resp) {

                if (resp.success) {

                    if (callback) {
                        callback(resp);
                    }

                    Rsd.showPopup("数据已删除。");
                    return false;//flase 表示拒绝后续拦截方法的处理
                } else {
                    Rsd.alert('数据删除失败', resp.msg);
                    return false;//flase 表示拒绝后续拦截方法的处理
                }
            });

            return;
        }

         //使用cqrs 
         me.handler.delete();
    },
     /** 
    * @private button 事件绑定
    * */
    _btn_delete: function _btn_delete() { 
        this.delete(); 
    },
    
    /** 
    * @private button 事件绑定
    * */
    _btn_cancel: function _btn_cancel() {

        this.close();
    },
 
    /**
    * 获取字段控件 by name or index 
    *  */
    foucsField: function foucsField(key) {
        if (Rsd.isEmpty(key)) {
            return this;
        }
        var ctrl = this.items[0].getFieldControl(key);
        ctrl && ctrl.focus();

        return this;
    },
    /**
     * 获取字段控件 by name or index 
     */
    getFieldControl: function getFieldControl(key) {

        return this.items[0].getFieldControl(key);
    },
    /*
   * 获取字段控件值 by name or index  
   * */
    getFieldValue: function getFieldControl(key) {
        var ctrl = this.items[0].getFieldControl(key);
        if(ctrl)
        {
            return ctrl.getValue();
        }
        console.error("未找到控件【"+key+"】by name or index"); 
    },
    /*
    * 设置字段值 by name or index  
    * */
    setFieldValue: function (key, value) {
        var ctrl = this.items[0].getFieldControl(key);
        if(ctrl)
        {
            return ctrl.setValue(value);
        }
       console.error("未找到控件【"+key+"】by name or index");
    },

    /*
    * 同步更新数据 将form 控件数据 和 form.data数据同步一致
    * */
    syncData: function syncData() {

        var _form = this.items[0];

        if (_form.checkRecord()) {

            return _form.getRecord(_form.data);

        }
        else {
            _form.showError();
        }
        return _form.data;
    },

    /**
    * @description 获取form数据,验证不通过时 返回null 
    *  
    * */
    getData: function () {

        var _form = this.items[0];
        if (_form.checkRecord()) {

            return _form.getRecord();

        } else {
            _form.showError();
        }
        return null;
    }

}, function (type) {

    var _readonlyGetter = function () {

        //console.log('_readonlyGetter',this.__readonly,this.hasOwnProperty('__readonly'),this.$className);
        return this.__readonly===true;

    };

    var _readonlySetter = function (value) {

        //console.trace('_readonlySetter',this.__readonly,value,this.$className);
        this.__readonly = value;  
        this.items[0].readonly = value;
        return;

    };
    this.defineProperty(type, "readonly", _readonlyGetter, _readonlySetter, false);
    //
    var _formGetter = function _formGetter()
    { 
       return this.items[0];
    };

    var _formSetter  =function _formSetter(value)
    {  
        if(Rsd.isObject(value))
        {
            Rsd.apply(this.items[0],value);
            return;
        } 
    }

    this.defineProperty(type,"form", _formGetter, _formSetter,true);
    //
    var _rightGetter = function () {
 
        return this.items[2];
    };
    var _rightSetter = function (value) {

        if(Rsd.isString(value))
        {
            this.items[2].xtype = value
        }
        if(Rsd.isObject(value))
        {
            Rsd.apply(this.items[2],value);
        } 

    };
    this.defineProperty(type,"right", _rightGetter, _rightSetter,false);
});